﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tilver.ConsoleTest.Model
{
    /*
    抽象工厂模式(Abstract Factory)
        提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    四个角色        
    抽象工厂(Abstract Factory)角色:这是工厂方法模式的核心,它与应用系统商业逻辑无关。
    具体工厂(Concrete Factory)角色：直接在客户端的调用下创建具体的实例。包含了选择合适的具体对象,而这个逻辑与应用系统的商业逻辑紧密相关。
    抽象产品(Abstract Product)角色：工厂方法模式所创建的对象的父类，或它们直接拥有的接口。
    具体产品(Concrete Product)角色：代表具体的产品。
    总结
    抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类，运用抽象工厂模式的关键点在于应对"多系列对象创建"的需求变化，学会了抽象工厂模式，你将理解OOP的精华:面向接口对象。
     */
    /// <summary>
    /// 用户类
    /// </summary>
    public class User
    {
        public int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        public string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    /// <summary>
    /// 部门类
    /// </summary>
    public class Department
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _deptNmae;
        public string DeptName
        {
            get { return _deptNmae; }
            set { _deptNmae = value; }
        }
    }
    /// <summary>
    /// 用户操作接口
    /// </summary>
    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }
    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在SQL Server中给User表增加了一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在SQL Server中根据id得到User表的一条记录");
            return null;
        }
    }

    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表增加了一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据id得到User表的一条记录");
            return null;
        }
    }

    interface IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }
    class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在SQL Server中给Department表增加了一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在SQL Server中根据id得到了Department表的一条记录");
            return null;
        }
    }

    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Accessz中给Department表增加了一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据id得到了Department表的一条记录");
            return null;
        }
    }

    interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

    class SqlServerFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }

        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

    class AccessFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }
}
